export function timeFix() {
  const time = new Date()
  const hour = time.getHours()
  return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好'
}

export function welcome() {
  const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了']
  const index = Math.floor(Math.random() * arr.length)
  return arr[index]
}

/**
 * 触发 window.resize
 */
export function triggerWindowResizeEvent() {
  const event = document.createEvent('HTMLEvents')
  event.initEvent('resize', true, true)
  event.eventType = 'message'
  window.dispatchEvent(event)
}

export function handleScrollHeader(callback) {
  let timer = 0

  let beforeScrollTop = window.pageYOffset
  callback = callback || function () {}
  window.addEventListener(
    'scroll',
    (event) => {
      clearTimeout(timer)
      timer = setTimeout(() => {
        let direction = 'up'
        const afterScrollTop = window.pageYOffset
        const delta = afterScrollTop - beforeScrollTop
        if (delta === 0) {
          return false
        }
        direction = delta > 0 ? 'down' : 'up'
        callback(direction)
        beforeScrollTop = afterScrollTop
      }, 50)
    },
    false
  )
}

export function isIE() {
  const bw = window.navigator.userAgent
  const compare = (s) => bw.indexOf(s) >= 0
  const ie11 = (() => 'ActiveXObject' in window)()
  return compare('MSIE') || ie11
}

/**
 * Remove loading animate
 * @param id parent element id or class
 * @param timeout
 */
export function removeLoadingAnimate(id = '', timeout = 1500) {
  if (id === '') {
    return
  }
  setTimeout(() => {
    document.body.removeChild(document.getElementById(id))
  }, timeout)
}
export function scorePassword(pass) {
  let score = 0
  if (!pass) {
    return score
  }
  // award every unique letter until 5 repetitions
  const letters = {}
  for (let i = 0; i < pass.length; i++) {
    letters[pass[i]] = (letters[pass[i]] || 0) + 1
    score += 5.0 / letters[pass[i]]
  }

  // bonus points for mixing it up
  const variations = {
    digits: /\d/.test(pass),
    lower: /[a-z]/.test(pass),
    upper: /[A-Z]/.test(pass),
    nonWords: /\W/.test(pass),
  }

  let variationCount = 0
  for (var check in variations) {
    variationCount += variations[check] === true ? 1 : 0
  }
  score += (variationCount - 1) * 10

  return parseInt(score)
}

/**
 * 确保URL使用正确的协议
 * @param url 原始URL
 * @returns 修正后的URL
 */
function ensureSecureProtocol(url) {
  // 如果当前页面是HTTPS，确保下载URL也使用HTTPS
  if (window.location.protocol === 'https:' && url.startsWith('http://')) {
    return url.replace('http://', 'https://')
  }
  return url
}

/**
 * 优化的文件下载方法 - 支持代理环境和HTTPS安全
 * @param url 下载地址
 * @param filename 下载后的文件名
 * @param options 额外配置选项
 */
export function downloadFileWithProxy(url, filename, options = {}) {
  // 确保使用正确的协议
  const secureUrl = ensureSecureProtocol(url)

  // 创建隐藏的iframe来处理下载，避免代理环境下的域名问题
  const iframe = document.createElement('iframe')
  iframe.style.display = 'none'
  iframe.src = secureUrl

  // 添加错误处理
  iframe.onerror = () => {
    if (document.body.contains(iframe)) {
      document.body.removeChild(iframe)
    }
    console.error('下载失败:', secureUrl)

    // 如果HTTPS下载失败，尝试使用fetch方式
    fallbackDownload(secureUrl, filename)
  }

  // 下载完成后清理iframe
  iframe.onload = () => {
    setTimeout(() => {
      if (document.body.contains(iframe)) {
        document.body.removeChild(iframe)
      }
    }, 1000)
  }

  document.body.appendChild(iframe)
}

/**
 * 降级下载方法 - 使用fetch处理HTTPS混合内容问题
 * @param url 下载地址
 * @param filename 文件名
 */
function fallbackDownload(url, filename) {
  fetch(url, {
    method: 'GET',
    credentials: 'include', // 包含认证信息
    headers: {
      Accept: 'application/octet-stream, */*',
    },
  })
    .then((response) => {
      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`)
      }
      return response.blob()
    })
    .then((blob) => {
      downloadBlobFile(blob, filename)
    })
    .catch((error) => {
      console.error('Fetch下载失败:', error)
      // 最后的降级方案：直接打开链接
      window.open(url, '_blank')
    })
}

/**
 * 优化的文件下载方法 - 使用Blob方式
 * @param blob Blob对象
 * @param filename 下载后的文件名
 */
export function downloadBlobFile(blob, filename) {
  // 检测浏览器支持
  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    // IE浏览器
    window.navigator.msSaveOrOpenBlob(blob, filename)
  } else {
    // 现代浏览器
    const url = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.download = filename

    // 确保链接被添加到DOM中
    document.body.appendChild(link)
    link.click()

    // 清理资源
    setTimeout(() => {
      if (document.body.contains(link)) {
        document.body.removeChild(link)
      }
      window.URL.revokeObjectURL(url)
    }, 100)
  }
}

/**
 * 通用文件下载方法 - 支持多种下载方式
 * @param request axios请求实例
 * @param url 下载地址
 * @param filename 文件名
 * @param options 配置选项
 */
export function universalDownload(request, url, filename, options = {}) {
  const { method = 'get', useBlob = true, timeout = 30000, headers = {} } = options

  if (useBlob) {
    // 使用blob方式下载
    return request({
      url,
      method,
      responseType: 'blob',
      timeout,
      headers: {
        Accept: 'application/octet-stream, */*',
        ...headers,
      },
    })
      .then((res) => {
        const blob = new Blob([res], { type: res.type })
        downloadBlobFile(blob, filename)
        return { success: true, fileName: filename }
      })
      .catch((error) => {
        console.error('Blob下载失败，尝试直接下载:', error)
        // 降级到直接下载
        downloadFileWithProxy(url, filename)
        throw error
      })
  } else {
    // 直接下载
    downloadFileWithProxy(url, filename)
    return Promise.resolve({ success: true, fileName: filename })
  }
}

/**
 * 下载文件的通用方法 - 兼容旧版本
 * @param url 下载地址
 * @param filename 下载后的文件名
 */
export function downloadFile(url, filename) {
  const a = document.createElement('a')
  a.href = url
  a.download = filename
  a.click()
}
/**
 * 处理模板下载的通用方法 - 增强HTTPS支持
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function handleTemplateDownload(request, url, params = {}, options = {}) {
  const {
    defaultFileName = 'template.xlsx',
    timeout = 30000,
    headers = {},
    fallbackBaseUrl = process.env.VUE_APP_API_BASE_URL,
  } = options

  return request({
    url,
    method: 'get',
    responseType: 'blob',
    params,
    timeout,
    headers: {
      Accept: 'application/octet-stream, application/vnd.ms-excel, */*',
      ...headers,
    },
  })
    .then((res) => {
      // 检查响应是否为有效的blob
      if (!res || !(res instanceof Blob)) {
        throw new Error('下载响应格式错误')
      }

      const blob = new Blob([res], {
        type: res.type || 'application/vnd.ms-excel',
      })

      // 生成文件名，支持从响应头获取
      let fileName = defaultFileName

      // 尝试从Content-Disposition头获取文件名
      const contentDisposition = res.headers && res.headers['content-disposition']
      if (contentDisposition) {
        const fileNameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)
        if (fileNameMatch && fileNameMatch[1]) {
          fileName = fileNameMatch[1].replace(/["']/g, '')
        }
      }

      // 使用工具类的下载方法
      downloadBlobFile(blob, fileName)

      return {
        success: true,
        fileName: fileName,
        size: blob.size,
      }
    })
    .catch((error) => {
      console.error('下载模板失败:', error)

      // 如果blob下载失败，尝试使用直接链接下载
      const queryString = new URLSearchParams(params).toString()
      let fallbackUrl = `${fallbackBaseUrl}${url}${queryString ? '?' + queryString : ''}`

      // 确保使用正确的协议
      fallbackUrl = ensureSecureProtocol(fallbackUrl)

      downloadFileWithProxy(fallbackUrl, defaultFileName)

      throw error
    })
}

/**
 * 专门处理Python模型模板下载
 * @param request axios请求实例
 * @param url 下载API地址
 * @param templateName 模板名称
 * @returns Promise
 */
export function downloadPythonTemplate(request, url, templateName, fileName) {
  return handleTemplateDownload(
    request,
    url,
    { templateName },
    {
      defaultFileName: fileName,
      timeout: 30000,
    }
  )
}

/**
 * 文件类型配置映射
 */
const FILE_TYPE_CONFIG = {
  // PDF文件
  pdf: {
    mimeType: 'application/pdf',
    accept: 'application/pdf, */*',
    timeout: 30000,
  },
  // ZIP压缩文件
  zip: {
    mimeType: 'application/zip',
    accept: 'application/zip, application/octet-stream, */*',
    timeout: 60000, // ZIP文件通常较大
  },
  // XML文件
  xml: {
    mimeType: 'application/xml',
    accept: 'application/xml, text/xml, */*',
    timeout: 30000,
  },
  // Excel文件
  xlsx: {
    mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel, */*',
    timeout: 30000,
  },
  xls: {
    mimeType: 'application/vnd.ms-excel',
    accept: 'application/vnd.ms-excel, */*',
    timeout: 30000,
  },
  // Word文档
  docx: {
    mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    accept: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/msword, */*',
    timeout: 30000,
  },
  doc: {
    mimeType: 'application/msword',
    accept: 'application/msword, */*',
    timeout: 30000,
  },
  // 图片文件
  jpg: {
    mimeType: 'image/jpeg',
    accept: 'image/jpeg, image/*, */*',
    timeout: 30000,
  },
  jpeg: {
    mimeType: 'image/jpeg',
    accept: 'image/jpeg, image/*, */*',
    timeout: 30000,
  },
  png: {
    mimeType: 'image/png',
    accept: 'image/png, image/*, */*',
    timeout: 30000,
  },
  // 文本文件
  txt: {
    mimeType: 'text/plain',
    accept: 'text/plain, text/*, */*',
    timeout: 30000,
  },
  csv: {
    mimeType: 'text/csv',
    accept: 'text/csv, text/*, */*',
    timeout: 30000,
  },
  // JSON文件
  json: {
    mimeType: 'application/json',
    accept: 'application/json, text/*, */*',
    timeout: 30000,
  },
  // 默认配置
  default: {
    mimeType: 'application/octet-stream',
    accept: 'application/octet-stream, */*',
    timeout: 30000,
  },
}

/**
 * 从文件名获取文件扩展名
 * @param fileName 文件名
 * @returns 文件扩展名（小写）
 */
function getFileExtension(fileName) {
  if (!fileName || typeof fileName !== 'string') {
    return 'default'
  }
  const lastDotIndex = fileName.lastIndexOf('.')
  if (lastDotIndex === -1) {
    return 'default'
  }
  return fileName.substring(lastDotIndex + 1).toLowerCase()
}

/**
 * 获取文件类型配置
 * @param fileName 文件名
 * @returns 文件类型配置对象
 */
function getFileTypeConfig(fileName) {
  const extension = getFileExtension(fileName)
  return FILE_TYPE_CONFIG[extension] || FILE_TYPE_CONFIG.default
}

/**
 * 通用文件下载方法 - 根据文件名自动识别文件类型
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function downloadFileByType(request, url, params = {}, options = {}) {
  const {
    defaultFileName = '',
    headers = {},
    fallbackBaseUrl = process.env.VUE_APP_API_BASE_URL,
    method = 'GET',
    ...customOptions
  } = options

  // 根据文件名获取文件类型配置
  const fileConfig = getFileTypeConfig(defaultFileName)
  const timeout = customOptions.timeout || fileConfig.timeout

  return request({
    url,
    method,
    responseType: 'blob',
    params,
    timeout,
    headers: {
      Accept: fileConfig.accept,
      ...headers,
    },
    withCredentials: true, // 包含Cookie认证信息
    ...customOptions,
  })
    .then((res) => {
      // 检查响应是否为有效的blob
      if (!res || !(res instanceof Blob)) {
        throw new Error(`${defaultFileName} 下载响应格式错误`)
      }

      const blob = new Blob([res], {
        type: fileConfig.mimeType,
      })

      // 生成文件名，支持从响应头获取
      let fileName = defaultFileName

      // 尝试从Content-Disposition头获取文件名
      const contentDisposition = res.headers && res.headers['content-disposition']
      if (contentDisposition) {
        const fileNameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/)
        if (fileNameMatch && fileNameMatch[1]) {
          fileName = fileNameMatch[1].replace(/["']/g, '')
        }
      }

      // 确保文件名有正确的扩展名
      const expectedExtension = getFileExtension(defaultFileName)
      if (expectedExtension !== 'default' && !fileName.toLowerCase().endsWith(`.${expectedExtension}`)) {
        fileName += `.${expectedExtension}`
      }

      // 使用工具类的下载方法
      downloadBlobFile(blob, fileName)

      return {
        success: true,
        fileName: fileName,
        size: blob.size,
        fileType: expectedExtension,
      }
    })
    .catch((error) => {
      console.error(`${defaultFileName} 下载失败:`, error)

      // 如果blob下载失败，尝试使用直接链接下载
      const queryString = new URLSearchParams(params).toString()
      let fallbackUrl = `${fallbackBaseUrl}${url}${queryString ? '?' + queryString : ''}`

      // 确保使用正确的协议
      fallbackUrl = ensureSecureProtocol(fallbackUrl)

      downloadFileWithProxy(fallbackUrl, defaultFileName)

      throw error
    })
}

/**
 * 专用下载方法的简化版本 - 保持向后兼容
 */

/**
 * 下载PDF文档 - 使用通用下载方法
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function downloadPDF(request, url, params = {}, options = {}) {
  const { defaultFileName = 'document.pdf', ...restOptions } = options
  return downloadFileByType(request, url, params, {
    defaultFileName,
    ...restOptions,
  })
}

/**
 * 下载ZIP文件 - 使用通用下载方法
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function downloadZIP(request, url, params = {}, options = {}) {
  const { defaultFileName = 'archive.zip', ...restOptions } = options
  return downloadFileByType(request, url, params, {
    defaultFileName,
    ...restOptions,
  })
}

/**
 * 下载XML文件 - 使用通用下载方法
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function downloadXML(request, url, params = {}, options = {}) {
  const { defaultFileName = 'document.xml', ...restOptions } = options
  return downloadFileByType(request, url, params, {
    defaultFileName,
    ...restOptions,
  })
}

/**
 * 下载Excel文件 - 使用通用下载方法
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function downloadExcel(request, url, params = {}, options = {}) {
  const { defaultFileName = 'document.xlsx', ...restOptions } = options
  return downloadFileByType(request, url, params, {
    defaultFileName,
    ...restOptions,
  })
}

/**
 * 下载Word文档 - 使用通用下载方法
 * @param request axios请求实例
 * @param url 下载API地址
 * @param params 请求参数
 * @param options 配置选项
 * @returns Promise
 */
export function downloadWord(request, url, params = {}, options = {}) {
  const { defaultFileName = 'document.docx', ...restOptions } = options
  return downloadFileByType(request, url, params, {
    defaultFileName,
    ...restOptions,
  })
}

/*
 * 复制文本到剪贴板
 * @param {string} text - 要复制的文本
 */
export async function copyText(text) {
  if (!text) {
    return Promise.resolve(false)
  }

  // 优先使用现代 Clipboard API
  if (navigator.clipboard && window.isSecureContext) {
    try {
      await navigator.clipboard.writeText(text)
      return Promise.resolve(true)
    } catch (error) {
      console.error('现代API复制失败:', error)
      return Promise.resolve(fallbackCopyText(text))
    }
  } else {
    // 直接使用传统方法
    return Promise.resolve(fallbackCopyText(text))
  }
}

/**
 * 降级复制方法 - 兼容旧浏览器
 * @param {string} text - 要复制的文本
 * @returns {boolean} 复制是否成功
 */
function fallbackCopyText(text) {
  try {
    // 创建临时文本域
    const textArea = document.createElement('textarea')
    textArea.value = text

    // 设置样式避免影响页面布局
    textArea.style.position = 'fixed'
    textArea.style.left = '-999999px'
    textArea.style.top = '-999999px'
    textArea.style.opacity = '0'
    textArea.style.pointerEvents = 'none'
    textArea.style.zIndex = '-1'

    // 添加到DOM
    document.body.appendChild(textArea)

    // 选中文本
    textArea.focus()
    textArea.select()

    // 兼容iOS Safari
    if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
      const range = document.createRange()
      range.selectNodeContents(textArea)
      const selection = window.getSelection()
      selection.removeAllRanges()
      selection.addRange(range)
      textArea.setSelectionRange(0, 999999)
    }

    // 执行复制命令
    const successful = document.execCommand('copy')

    // 清理DOM
    document.body.removeChild(textArea)

    return successful
  } catch (error) {
    console.error('降级复制方法失败:', error)
    return false
  }
}
